/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingWorker;
import model.Algoritmo;
import model.Arista;
import model.Carga;
import model.Cliente;
import model.HistorialVuelo;
import model.Nodo;
import model.ObjetoTablaEnvios;
import model.Paquete;
import view.EstadoRegistro;
import view.ListaIdsPaquetes;
import view.Registro;

/**
 *
 * @author Enrique
 */
public class WorkerRegistro extends SwingWorker<Void, Integer>{

    private Registro ventana;
    private EstadoRegistro ventanaEspera;
    
    private JTextField txtNombres;
    private JTextField txtApPat;
    private JTextField txtApMat;
    private JTextField txtDocID;
    private JTextField txtEmail;
    private JTextField txtTelefono;
    private JRadioButton rdNuevo;
    private JRadioButton rdNatural;
    private JRadioButton rdEmpresa;
    private Cliente cliente;
    List<ObjetoTablaEnvios> listaFilasTablaEnvios;
    
    public WorkerRegistro(Registro ventana, EstadoRegistro ventanaEspera){
        this.ventana = ventana;
        this.ventanaEspera = ventanaEspera;
        this.txtNombres = ventana.getTxtNombres();
        this.txtApPat = ventana.getTxtApPat();
        this.txtApMat = ventana.getTxtApMat();
        this.txtDocID = ventana.getTxtDocID();
        this.txtEmail = ventana.getTxtEmail();
        this.txtTelefono = ventana.getTxtTelefono();
        this.rdNuevo = ventana.getRdNuevo();
        this.rdNatural = ventana.getRdNatural();
        this.rdEmpresa = ventana.getRdEmpresa();
        this.cliente = ventana.getCliente();
        this.listaFilasTablaEnvios = ventana.getListaFilasTablaEnvios();
    }
    
    @Override
    protected Void doInBackground() throws Exception {
        
                List<Nodo> listaNodos = new ArrayList<Nodo>();    //lista de nodos del grafo
                List<Arista> listaAristas = new ArrayList<Arista>(); //lista de aristas del grafo
                model.Simulacion simu = new model.Simulacion();
                simu.setListaNodos(listaNodos);
                simu.setListaAristas(listaAristas);
                List<Paquete> listaPaquetes = new ArrayList<Paquete>();    // lista de paquetes guardados

                // ventana de estado del registro
                EstadoRegistro ventana = new EstadoRegistro();
                //ventana.getLblEstado().setText("Guardando información del cliente.");
                //ventana.setVisible(true);

                //Realizo registro
                // obtengo el cliente
                    boolean correoValido = this.ventana.validaCorreo(txtEmail.getText());
                    if (!correoValido) {
                        JOptionPane.showMessageDialog(null, "Por favor introduzca un correo válido", "Correo inválido", JOptionPane.ERROR_MESSAGE);
                    } else {
                        if (this.rdNuevo.isSelected()) { // si es un cliente nuevo, tengo que obtener sus datos. sino, ya tengo al cliente antiguo

                            cliente = new Cliente();

                            if (this.rdNatural.isSelected()) {   // si es persona natural

                                // relleno los datos del cliente
                                this.cliente.setNombres(this.txtNombres.getText());
                                this.cliente.setApPaterno(this.txtApPat.getText());
                                this.cliente.setApMaterno(this.txtApMat.getText());
                                this.cliente.setDni(this.txtDocID.getText());
                                this.cliente.setEmail(this.txtEmail.getText());
                                this.cliente.setTelefono(this.txtTelefono.getText());
                                this.cliente.setTipo("natural");
                            } else if (this.rdEmpresa.isSelected()) {  // si es empresa

                                // relleno los datos del cliente
                                this.cliente.setRazonSocial(this.txtNombres.getText());
                                this.cliente.setRuc(this.txtDocID.getText());
                                this.cliente.setEmail(this.txtEmail.getText());
                                this.cliente.setTelefono(this.txtTelefono.getText());
                                this.cliente.setTipo("empresa");
                            }

                            // guardo al cliente en la BD
                            ClienteController.guardarCliente(cliente);
                        }
                    
                

                //ventana.getLblEstado().setText("Cargando información sobre los vuelos.");
                // cargo estructuras de datos desde BD para correr algoritmo en los paquetes
                Carga.rellenarListaNodosDesdeBD(simu);
                Carga.rellenarListaAristasDesdeBD(simu);
                Carga.rellenarListaAristasVecinas(simu);
                Carga.inicializarEstructuras(simu);

                // genero fechas de vuelos para 1 mes a partir de la fecha actual
                //FechasDeVuelos.Generar2Meses(simu);
                //ventana.getLblEstado().setText("Asignando vuelos a los paquetes.");
                // corro algoritmo en los paquetes y los guardo
                for (int numFilas = 0; numFilas < this.listaFilasTablaEnvios.size(); numFilas++) {   // para cada uno de los paquetes

                    // preparo el paquete modelo
                    listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().setFechaHoraRecepcion(new Date()); // le asigno fecha de recepcion al paquete
                    listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().setCliente(cliente); // le asigno cliente

                    for (int numPaquetes = 0; numPaquetes < listaFilasTablaEnvios.get(numFilas).getCantidadPaquetes(); numPaquetes++) {  // para cada uno de los paquetes

                        // creo paquete a guardar en base al paquete modelo
                        Paquete paqueteTemp = new Paquete();
                        paqueteTemp.setApMatReceptor(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getApMatReceptor());
                        paqueteTemp.setApPatReceptor(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getApPatReceptor());
                        paqueteTemp.setCiudadByIdCiudadDestino(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getCiudadByIdCiudadDestino());
                        paqueteTemp.setCiudadByIdCiudadOrigen(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getCiudadByIdCiudadOrigen());
                        paqueteTemp.setCliente(cliente);
                        paqueteTemp.setDescripcion(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getDescripcion());
                        paqueteTemp.setEmailReceptor(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getEmailReceptor());
                        paqueteTemp.setEstado(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getEstado());
                        paqueteTemp.setFechaHoraRecepcion(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getFechaHoraRecepcion());
                        paqueteTemp.setIdentificador(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getIdentificador());
                        paqueteTemp.setNombresReceptor(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getNombresReceptor());
                        paqueteTemp.setRazonSocialReceptor(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getRazonSocialReceptor());
                        paqueteTemp.setRucReceptor(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getRucReceptor());
                        paqueteTemp.setTelefonoReceptor(listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getTelefonoReceptor());
                        paqueteTemp.setEstado("En espera en " + listaFilasTablaEnvios.get(numFilas).getPaqueteModelo().getCiudadByIdCiudadOrigen().getCiudad());

                        //Algoritmo.algoritmoAEstrella(simu, listaFilasTablaEnvios.get(numFilas).getPaqueteModelo()); // algoritmo para rutear paquetes
                        Algoritmo.algoritmoAEstrella(simu, paqueteTemp); // algoritmo para rutear paquetes

                        PaqueteController.guardarPaquete(paqueteTemp);  // guardo paquete en la BD
                        listaPaquetes.add(paqueteTemp);    // guardo paquete en la lista de paquetes

                    }
                }

                // actualizo estructuras de datos en la BD
    //            for (int i=0; i<simu.getListaNodos().size(); i++)
    //                CiudadController.actualizarCiudad(simu.getListaNodos().get(i).getCiudad());
    //            for (int i=0; i<simu.getListaAristas().size(); i++)
    //                VueloController.actualizarVuelo(simu.getListaAristas().get(i).getVuelo());
                //ventana.getLblEstado().setText("Guardando información de los paquetes.");
                for (int i = 0; i < listaPaquetes.size(); i++) {
                    Iterator<HistorialVuelo> iterador = listaPaquetes.get(i).getHistorialVuelos().iterator();
                    while (iterador.hasNext()) {
                        HistorialVuelo historialVuelo = iterador.next();
                        HistorialVueloController.actualizarHistorialVueloEnBD(historialVuelo);
                    }

                }

                // codigo para obtener el ObjetoTablaEnvio de la fila seleccionada
    //            int numFila = this.tblPaquete.getSelectedRow();
    //            System.out.println(this.listaFilasTablaEnvios.get(numFila).getCantidadPaquetes()
    //                    + " " + this.listaFilasTablaEnvios.get(numFila).getPaqueteModelo().getCiudadByIdCiudadDestino().getCiudad());
                

                // Abro ventana para mostrar IDs de paquetes
                ListaIdsPaquetes ventanaIds = new ListaIdsPaquetes(listaPaquetes);   // le paso la lista de ids de paquetes a mostrar
                ventanaEspera.dispose();
                //ventana.dispose();
                ventanaIds.setVisible(true);
                //this.ventana.dispose();
                    }
        return null;
    }
    
}
